#include "WString.h"
#include <iostream>

WString::WString(const char *cdata)
{
    if (cdata)
    {
        _len = strlen(cdata);
        _data = new char[_len];
        memcpy(_data, cdata, _len);
    }
}

WString::WString(const WString &str)
{
    std::cout << "enter copy constructor" << std::endl;
    _len = str._len;
    if (_data)
    {
        delete [] _data;
    }

     // 复制构造函数里面是完全的深拷贝
    _data = new char[_len];
    memcpy(_data, str._data, _len);
}

WString::WString(WString &&str)
{
    std::cout << "enter move constructor" << std::endl;
    _len = str._len;
    if (_data)
    {
        delete [] _data;
    }

    // 转移构造函数里面是浅拷贝，承接右职的空间，节约性能
    _data = str._data;
    str._data = nullptr;
}

WString::~WString()
{
    _len = 0;
    // 被承接走空间的右职在这个地方就不会删除空间
    if (_data)
    {
        delete [] _data;
        _data = nullptr;
    }
}

WString &WString::operator=(const WString &str)
{
    std::cout << "enter copy operator=" << std::endl;
    _len = str._len;
    if (_data)
    {
        delete [] _data;
    }

     // 重载左值赋值运算符里面是完全的深拷贝
    _data = new char[_len];
    memcpy(_data, str._data, _len);
    return *this;
}

WString &WString::operator=(WString &&str)
{
    std::cout << "enter move operator=" << std::endl;
    _len = str._len;
    if (_data)
    {
        delete [] _data;
    }

    // 重载右值赋值运算符里面是浅拷贝，承接右职的空间，节约性能
    _data = str._data;
    str._data = nullptr;
    return *this;
}

long long WString::size()
{
    return _len;
}

const char *WString::c_str()
{
    return _data;
}

char& WString::operator[](long long n)
{
    return *(_data + n);
}


